﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using HtmlAgilityPack;
using System.Diagnostics;
using System.Net;
using System.Text.RegularExpressions;
using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.util;
using System.Globalization;

namespace Rsa
{
    class GestorEmenta
    {
        private GestorConfigXML Gxml = null;
        private GestorBD gestorDB = new GestorBD();
        private List<Lista> _listaEmenta = null;

        private List<ementaDB> _listaEmentasDB = null;

        private List<string> _cantinas_urls = new List<string>();
        private List<string> _pdfs_urls = new List<string>();

        private List<Ementa> _ementas = new List<Ementa>(); // lista para guardar as ementas na base de dados

        private string Cantina1_url = null;
        private string Cantina2_url = null;
        private string Cantina3_url = null;
        private string Cantina4_url = null;
        private string Cantina5_url = null;
        private int Cantina1_cb = 0;
        private int Cantina2_cb = 0;
        private int Cantina3_cb = 0;
        private int Cantina4_cb = 0;
        private int Cantina5_cb = 0;
        private int Dias_mostrar = 0;

        public GestorEmenta(GestorConfigXML gx)
        {
            Gxml = gx;
        }

        public void start(int opcao)
        {
            this.loadConfigEmenta();
            this.testCantinaSelecionado();

            #region popular lista de urls dos pdfs

            //ir buscar urls das ementas para as respectivas cantinas
            foreach (string u in Cantinas_urls)
            {
                Debug.WriteLine(u);
                WebClient client = new WebClient();
                string htmlCode = client.DownloadString(u);
                Regex regex = new Regex("/resources2(.+)pdf");
                foreach (Match match in regex.Matches(htmlCode))
                {
                    string link = match.Value;
                    link = "http://www.ipleiria.pt" + link;
                    link = link.Replace(" ", "%20");
                    link = link.Replace("&amp;", "&");
                    Pdfs_urls.Add(link);
                }
            }
            #endregion

            #region parsing dos pdfs

            string pdf_string = null;
            WebClient webClient = new WebClient();

            foreach (string u in Pdfs_urls)
            {
                Ementa e = new Ementa();
                bool almoco = true;
                int cantina;
                int campus;

                //Debug.WriteLine(u);

                //Download ficheiro pdf
                webClient.DownloadFile(u, @"../../bin/Debug/ementa_temp.pdf");

                //Converter PDF para string
                pdf_string = parseUsingPDFBox("../../bin/Debug/ementa_temp.pdf");
                string[] pdf_lines = pdf_string.Replace("\r", "").Split('\n');
                
                //Cantina e Campus
                cantina = Int32.Parse(Regex.Match(pdf_string, @"CANTINA (\d)").Groups[1].Value);
                campus = Int32.Parse(Regex.Match(pdf_string, @"CAMPUS (\d)").Groups[1].Value);

                e.Cantina = cantina;
                e.Campus = campus;

                for (int i = 2; i < pdf_lines.Length-1; i++)
                {                    
                    //remover espaços do inicio e do fim da string
                    pdf_lines[i] = pdf_lines[i].Trim();

                    //Dia da Semana
                    if (Regex.IsMatch(pdf_lines[i], @"-feira"))
                    {
                        Ementas.Add(e);
                        e = new Ementa();
                        e.Cantina = cantina;
                        e.Campus = campus;
                    }

                    //Data no formato dd-MM-yyyy
                    else if (Regex.IsMatch(pdf_lines[i], @"\d{2}-\d{2}-\d{4}"))
                    {
                        pdf_lines[i] = pdf_lines[i].Substring(0, 10);
                        e.Data = DateTime.ParseExact(pdf_lines[i], "dd-MM-yyyy", null);
                        almoco = true;
                    }

                    //Sopa
                    else if (Regex.IsMatch(pdf_lines[i], @"Sopa:"))
                    {
                        if (almoco)
                        {
                            e.Almoco.Sopa = pdf_lines[i];
                            while (!Regex.IsMatch(pdf_lines[i + 1], @":"))
                            {
                                i++;
                                pdf_lines[i] = pdf_lines[i].Trim();
                                e.Almoco.Sopa += " " + pdf_lines[i];
                            }
                        }
                        else
                        {
                            e.Jantar.Sopa = pdf_lines[i];
                            while (!Regex.IsMatch(pdf_lines[i + 1], @":"))
                            {
                                i++;
                                pdf_lines[i] = pdf_lines[i].Trim();
                                e.Jantar.Sopa += " " + pdf_lines[i];
                            }
                        }
                    }

                    //Carne
                    else if (Regex.IsMatch(pdf_lines[i], @"Carne:"))
                    {
                        if (almoco)
                        {
                            e.Almoco.Carne = pdf_lines[i];
                            while (!Regex.IsMatch(pdf_lines[i + 1], @":"))
                            {
                                i++;
                                pdf_lines[i] = pdf_lines[i].Trim();
                                e.Almoco.Carne += " " + pdf_lines[i];
                            }
                        }
                        else
                        {
                            e.Jantar.Carne = pdf_lines[i];
                            while (!Regex.IsMatch(pdf_lines[i + 1], @":"))
                            {
                                i++;
                                pdf_lines[i] = pdf_lines[i].Trim();
                                e.Jantar.Carne += " " + pdf_lines[i];
                            }
                        }
                    }

                    //Peixe
                    else if (Regex.IsMatch(pdf_lines[i], @"Peixe:"))
                    {
                        if (almoco)
                        {
                            e.Almoco.Peixe = pdf_lines[i];
                            while (!Regex.IsMatch(pdf_lines[i + 1], @":"))
                            {
                                i++;
                                pdf_lines[i] = pdf_lines[i].Trim();
                                e.Almoco.Peixe += " " + pdf_lines[i];
                            }
                        }
                        else
                        {
                            e.Jantar.Peixe = pdf_lines[i];
                            while (!Regex.IsMatch(pdf_lines[i + 1], @":"))
                            {
                                i++;
                                pdf_lines[i] = pdf_lines[i].Trim();
                                e.Jantar.Peixe += " " + pdf_lines[i];
                            }
                        }
                    }

                    //Vegetariano
                    else if (Regex.IsMatch(pdf_lines[i], @"Vegetariano:"))
                    {
                        if (almoco)
                        {
                            e.Almoco.Vegetariano = pdf_lines[i];
                            while (!Regex.IsMatch(pdf_lines[i + 1], @":"))
                            {
                                i++;
                                pdf_lines[i] = pdf_lines[i].Trim();
                                e.Almoco.Vegetariano += " " + pdf_lines[i];
                            }
                        }
                        else
                        {
                            e.Jantar.Vegetariano = pdf_lines[i];
                            while (!Regex.IsMatch(pdf_lines[i + 1], @":"))
                            {
                                i++;
                                pdf_lines[i] = pdf_lines[i].Trim();
                                e.Jantar.Vegetariano += " " + pdf_lines[i];
                            }
                        }
                    }

                    //Sobremesa
                    else if (Regex.IsMatch(pdf_lines[i], @"Sobremesa:"))
                    {
                        if (almoco)
                        {
                            e.Almoco.Sobremesa = pdf_lines[i];
                            almoco = false;
                        }
                        else
                        {
                            e.Jantar.Sobremesa = pdf_lines[i];
                            almoco = true;
                        }
                    }

                }//for
                Ementas.Add(e);

                //break;
            }
            #endregion

            #region debug

            bool debug = false;
            if (debug)
            {
                foreach (Ementa e in Ementas)
                {
                    Debug.WriteLine("\nCAMPUS " + e.Campus);
                    Debug.WriteLine("CANTINA " + e.Cantina);
                    Debug.WriteLine(e.Data.ToString("dd-MM-yyyy"));
                    Debug.WriteLine("ALMOÇO");
                    Debug.WriteLine(e.Almoco.Sopa);
                    Debug.WriteLine(e.Almoco.Carne);
                    Debug.WriteLine(e.Almoco.Peixe);
                    Debug.WriteLine(e.Almoco.Vegetariano);
                    Debug.WriteLine(e.Almoco.Sobremesa);
                    Debug.WriteLine("JANTAR");
                    Debug.WriteLine(e.Jantar.Sopa);
                    Debug.WriteLine(e.Jantar.Carne);
                    Debug.WriteLine(e.Jantar.Peixe);
                    Debug.WriteLine(e.Jantar.Vegetariano);
                    Debug.WriteLine(e.Jantar.Sobremesa);
                }
            }
            Debug.WriteLine("\nTotal Ementas = " + Ementas.Count);
            #endregion   

            #region adicionar ementas à DB
            int id=0;
            foreach (Ementa e in Ementas)
            {
                id = gestorDB.existeEmenta(e.Data, e.Cantina);
                if (id != 0)
                {
                    gestorDB.updateEmenta(e, id);
                }
                else
                {
                    gestorDB.addEmenta(e);
                }
            }
            #endregion

            Ementas.Clear();
            Ementas = gestorDB.pesquisaPorData(DateTime.Today,Dias_mostrar);

            #region validar opcoes dropdown e popular a ListaEmenta

            ListaEmenta = new List<Lista>();
            if (opcao == 0)
            {
                foreach (Ementa e in Ementas)
                {
                    Lista item = new Lista();
                    Regex r = new Regex("");
                    string corpo_template = System.IO.File.ReadAllText("../../templates/template_ementa_almoco_jantar.html");

                    r = new Regex(@"cantina");
                    corpo_template = r.Replace(corpo_template, "CANTINA " + e.Cantina + " - CAMPUS " + e.Campus);

                    r = new Regex(@"data");
                    corpo_template = r.Replace(corpo_template, CultureInfo.CurrentCulture.TextInfo.ToTitleCase(e.Data.ToString("dddd", new CultureInfo("pt-PT"))) + " " + e.Data.ToString("dd-MM-yyyy"));

                    r = new Regex(@"asopa");
                    if (String.IsNullOrEmpty(e.Almoco.Sopa)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Almoco.Sopa + "</div>");

                    r = new Regex(@"acarne");
                    if (String.IsNullOrEmpty(e.Almoco.Carne)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Almoco.Carne + "</div>");

                    r = new Regex(@"apeixe");
                    if (String.IsNullOrEmpty(e.Almoco.Peixe)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Almoco.Peixe + "</div>");

                    r = new Regex(@"avegetariano");
                    if (String.IsNullOrEmpty(e.Almoco.Vegetariano)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Almoco.Vegetariano + "</div>");

                    r = new Regex(@"asobremesa");
                    if (String.IsNullOrEmpty(e.Almoco.Sobremesa)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Almoco.Sobremesa + "</div>");

                    r = new Regex(@"jsopa");
                    if (String.IsNullOrEmpty(e.Jantar.Sopa)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Jantar.Sopa + "</div>");

                    r = new Regex(@"jcarne");
                    if (String.IsNullOrEmpty(e.Jantar.Carne)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Jantar.Carne + "</div>");

                    r = new Regex(@"jpeixe");
                    if (String.IsNullOrEmpty(e.Jantar.Peixe)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Jantar.Peixe + "</div>");

                    r = new Regex(@"jvegetariano");
                    if (String.IsNullOrEmpty(e.Jantar.Vegetariano)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Jantar.Vegetariano + "</div>");

                    r = new Regex(@"jsobremesa");
                    if (String.IsNullOrEmpty(e.Jantar.Sobremesa)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Jantar.Sobremesa + "</div>");

                    item.Data = e.Data;
                    item.Imagem = "../../imagens/cantina.png";
                    item.Titulo = "Cantina " + e.Cantina;
                    item.Resumo = "Ementa do almoço e jantar";
                    item.Corpo = corpo_template;

                    ListaEmenta.Add(item);
                }
            }
            else if (opcao == 1)
            {
                foreach (Ementa e in Ementas)
                {
                    Lista item = new Lista();
                    Regex r = new Regex("");
                    string corpo_template = System.IO.File.ReadAllText("../../templates/template_ementa_almoco.html");

                    r = new Regex(@"cantina");
                    corpo_template = r.Replace(corpo_template, "CANTINA " + e.Cantina + " - CAMPUS " + e.Campus);

                    r = new Regex(@"data");
                    corpo_template = r.Replace(corpo_template, CultureInfo.CurrentCulture.TextInfo.ToTitleCase(e.Data.ToString("dddd", new CultureInfo("pt-PT"))) + " " + e.Data.ToString("dd-MM-yyyy"));

                    r = new Regex(@"sopa");
                    if (String.IsNullOrEmpty(e.Almoco.Sopa)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Almoco.Sopa + "</div>");

                    r = new Regex(@"carne");
                    if (String.IsNullOrEmpty(e.Almoco.Carne)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Almoco.Carne + "</div>");

                    r = new Regex(@"peixe");
                    if (String.IsNullOrEmpty(e.Almoco.Peixe)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Almoco.Peixe + "</div>");

                    r = new Regex(@"vegetariano");
                    if (String.IsNullOrEmpty(e.Almoco.Vegetariano)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Almoco.Vegetariano + "</div>");

                    r = new Regex(@"sobremesa");
                    if (String.IsNullOrEmpty(e.Almoco.Sobremesa)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Almoco.Sobremesa + "</div>");

                    item.Data = e.Data;
                    item.Imagem = "../../imagens/cantina.png";
                    item.Titulo = "Cantina " + e.Cantina;
                    item.Resumo = "Ementa do almoço";
                    item.Corpo = corpo_template;

                    ListaEmenta.Add(item);
                }
            }
            else if (opcao == 2)
            {
                foreach (Ementa e in Ementas)
                {
                    Lista item = new Lista();
                    Regex r = new Regex("");
                    string corpo_template = System.IO.File.ReadAllText("../../templates/template_ementa_jantar.html");

                    r = new Regex(@"cantina");
                    corpo_template = r.Replace(corpo_template, "CANTINA " + e.Cantina + " - CAMPUS " + e.Campus);

                    r = new Regex(@"data");
                    corpo_template = r.Replace(corpo_template, CultureInfo.CurrentCulture.TextInfo.ToTitleCase(e.Data.ToString("dddd", new CultureInfo("pt-PT"))) + " " + e.Data.ToString("dd-MM-yyyy"));

                    r = new Regex(@"sopa");
                    if (String.IsNullOrEmpty(e.Jantar.Sopa)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Jantar.Sopa + "</div>");

                    r = new Regex(@"carne");
                    if (String.IsNullOrEmpty(e.Jantar.Carne)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Jantar.Carne + "</div>");

                    r = new Regex(@"peixe");
                    if (String.IsNullOrEmpty(e.Jantar.Peixe)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Jantar.Peixe + "</div>");

                    r = new Regex(@"vegetariano");
                    if (String.IsNullOrEmpty(e.Jantar.Vegetariano)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Jantar.Vegetariano + "</div>");

                    r = new Regex(@"sobremesa");
                    if (String.IsNullOrEmpty(e.Jantar.Sobremesa)) corpo_template = r.Replace(corpo_template, @"");
                    else corpo_template = r.Replace(corpo_template, "<div>" + e.Jantar.Sobremesa + "</div>");

                    item.Data = e.Data;
                    item.Imagem = "../../imagens/cantina.png";
                    item.Titulo = "Cantina " + e.Cantina;
                    item.Resumo = "Ementa do jantar";
                    item.Corpo = corpo_template;

                    ListaEmenta.Add(item);
                }
            }
            //Debug.WriteLine("\nTotal Ementas passadas para a Lista= " + ListaEmenta.Count);

            #endregion

            Cantinas_urls.Clear();
            Pdfs_urls.Clear();
            Ementas.Clear();
        }

        private static string parseUsingPDFBox(string filename)
        {
            PDDocument doc = PDDocument.load(filename);
            PDFTextStripper stripper = new PDFTextStripper();
            return stripper.getText(doc);
        }

        public void testCantinaSelecionado(){

            if (Cantina1_cb == 1)
            {
                Cantinas_urls.Add(Cantina1_url);
            }
            if (Cantina2_cb == 1)
            {
                Cantinas_urls.Add(Cantina2_url);
            }
            if (Cantina3_cb == 1)
            {
                Cantinas_urls.Add(Cantina3_url);
            }
            if (Cantina4_cb == 1)
            {
                Cantinas_urls.Add(Cantina4_url);
            }
            if (Cantina5_cb == 1)
            {
                Cantinas_urls.Add(Cantina5_url);
            }

        }

        //carrega a configuração
        public void loadConfigEmenta()
        {
            Hashtable hash = Gxml.loadEmenta();
            Cantina1_url = (string)hash["cantina1_url"];
            Cantina2_url = (string)hash["cantina2_url"];
            Cantina3_url = (string)hash["cantina3_url"];
            Cantina4_url = (string)hash["cantina4_url"];
            Cantina5_url = (string)hash["cantina5_url"];
            Cantina1_cb = Convert.ToInt32(hash["cantina1_cb"]);
            Cantina2_cb = Convert.ToInt32(hash["cantina2_cb"]);
            Cantina3_cb = Convert.ToInt32(hash["cantina3_cb"]);
            Cantina4_cb = Convert.ToInt32(hash["cantina4_cb"]);
            Cantina5_cb = Convert.ToInt32(hash["cantina5_cb"]);
            Dias_mostrar = Convert.ToInt32(hash["dias_mostrar"]);
        }

        #region gets e sets

        public List<string> Cantinas_urls
        {
            get { return _cantinas_urls; }
            set { _cantinas_urls = value; }
        }

        public List<string> Pdfs_urls
        {
            get { return _pdfs_urls; }
            set { _pdfs_urls = value; }
        }

        public List<Lista> ListaEmenta
        {
            get { return _listaEmenta; }
            set { _listaEmenta = value; }
        }

        internal List<Ementa> Ementas
        {
            get { return _ementas; }
            set { _ementas = value; }
        }

        public List<ementaDB> ListaEmentasDB
        {
            get { return _listaEmentasDB; }
            set { _listaEmentasDB = value; }
        }

        #endregion
    }
}
